class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ret;
        int hash1[26] = {0}, hash2[26] = {0};
        //1.先填充hash2, 对应p
        for (char ch : p)   hash2[ch-'a']++;
        //2.滑动窗口
        int count = 0;//窗口有效字符个数
        int sz_s = s.size(), sz_p = p.size();
        for (int left=0,right=0; right < sz_s; right++)//进窗口;
        {
            hash1[s[right]-'a']++;//进窗口
            if (hash1[s[right]-'a'] <= hash2[s[right]-'a'])     count++;//有效字符

            //注意: 先出窗口, 后记录, 就只用考虑窗口中后sz_p个元素, 巧妙的在循环结束前判断完所有窗口

            //判断是否需要 出窗口
            if (right - left + 1 > sz_p)
            {
                if (hash1[s[left]-'a'] <= hash2[s[left]-'a'])   count--;//是有效字符才--
                hash1[s[left]-'a']--;
                left++;
            }

            //判断是否需要 记录;  //判断第一个窗口时没有先出窗口
            if (count == sz_p)  ret.push_back(left);//记录
        }
        return ret;
    }
};
//时间: O(n) 
//空间: O(26*2)